﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using PAT.Data;
using PAT.Data.Bases;
using PAT.Entities;
using PAT.Services;
using PAT.Util;

public partial class aspx_tal01_CrearCita : System.Web.UI.Page
{
    #region Atributos
    private Common instanciaCommon = new Common();
    #endregion

    #region Eventos
    /// <summary>
    /// 
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Load(object sender, EventArgs e)
    {
        FormNuevaCita1.AcceptEvent += new EventHandler(FormNuevaCita1_AcceptEvent);
        FormNuevaCita1.CancelEvent += new EventHandler(FormNuevaCita1_CancelEvent);
        if (!IsPostBack)
        {
            UtilUI.BindListControl(ddlEmpresas, instanciaCommon.GetEmpresasPorEstado(true), "IdEmpresa", "RazonSocial", true);
            UtilUI.AddNullItemListControl(ddlTalleres, true);
            calTxtFechaConsulta.Format = ConfigurationManager.AppSettings["DateFormat"];
            txtFechaConsulta.Attributes.Add("readonly", "readonly");
            txtFechaConsulta.Text = DateTime.Now.ToString(ConfigurationManager.AppSettings["DateFormat"]);
            hdToday.Value = DateTime.Now.ToString(ConfigurationManager.AppSettings["DateFormat"]);
        }
        if (Session["dsCitas"] != null)
            BindGridCitas((DataSet)Session["dsCitas"]);
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void FormNuevaCita1_CancelEvent(object sender, EventArgs e)
    {
        mdlFormaNuevaCita.Hide();
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void FormNuevaCita1_AcceptEvent(object sender, EventArgs e)
    {
        String message = String.Empty;
        try
        {
            TList<PatCitaTaller> citasTaller = new TList<PatCitaTaller>();
            TList<PatEmpleado> mecanicos = new TList<PatEmpleado>();
            Session["dsCitas"] = instanciaCommon.GetSourceCitasTaller(Convert.ToInt32(hdValueTaller.Value), TipoEmpleado.RecepcionistaTaller, Convert.ToDateTime(hdValueDate.Value), ref citasTaller, ref mecanicos);
            Session["listCitasTaller"] = citasTaller;
            Session["mecanicos"] = mecanicos;
            message = "Cita creada con exito";
        }
        catch (Exception ex)
        {
            message = String.Format("Error: {0}", ex.Message);
        }
        finally
        {
            BindGridCitas((DataSet)Session["dsCitas"]);
            mdlFormaNuevaCita.Hide();
            lblConfirmText.Text = message;
            mdlConfirmModal.Show();
        }
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void ddlEmpresas_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (ddlEmpresas.SelectedValue == String.Empty)
            UtilUI.AddNullItemListControl(ddlTalleres, true);
        else
            UtilUI.BindListControl(ddlTalleres, instanciaCommon.GetTallerPorEmpresa(Convert.ToInt32(ddlEmpresas.SelectedValue)), "IdTaller", "DescripcionTaller", true);
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnConsultarMecanicos_Click(object sender, EventArgs e)
    {
        TList<PatCitaTaller> citasTaller = new TList<PatCitaTaller>();
        TList<PatEmpleado> mecanicos = new TList<PatEmpleado>();
        hdValueDate.Value = txtFechaConsulta.Text;
        hdValueTaller.Value = ddlTalleres.SelectedValue;
        hdValueNombreTaller.Value = ddlTalleres.SelectedItem.Text;
        Session["dsCitas"] = instanciaCommon.GetSourceCitasTaller(Convert.ToInt32(ddlTalleres.SelectedValue), TipoEmpleado.RecepcionistaTaller, Convert.ToDateTime(txtFechaConsulta.Text), ref citasTaller, ref mecanicos);
        Session["listCitasTaller"] = citasTaller;
        Session["mecanicos"] = mecanicos;
        BindGridCitas((DataSet)Session["dsCitas"]);
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="dsCitas"></param>
    private void BindGridCitas(DataSet dsCitas)
    {
        grdCitas.DataSource = dsCitas;
        grdCitas.DataBind();
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void grdCitas_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            string[] horas = e.Row.Cells[0].Text.Split('-');
            // Se obtiene el rango de tiempo y se crea un objeto tipo datetime con la fecha seleccionada en el calendario
            DateTime inicioRango = Convert.ToDateTime(hdValueDate.Value + " " + horas[0].Trim());
            DateTime finalRango = Convert.ToDateTime(hdValueDate.Value + " " + horas[1].Trim());
            // Se recorren las columnas desde la columna 1 hasta el largo menos 1
            for (int i = 1; i <= grdCitas.HeaderRow.Cells.Count - 1; i++)
            {
                // Se busca el nombre del mecanico en la lista de mecanicos y se obtiene su id
                string nombreMecanico = grdCitas.HeaderRow.Cells[i].Text.Trim();
                PatEmpleado empleadoEncontrado = ((TList<PatEmpleado>)Session["mecanicos"]).Find(delegate(PatEmpleado utilEmpleado) { return ((utilEmpleado.Nombres + " " + utilEmpleado.Apellidos) == nombreMecanico); });
                if (empleadoEncontrado != null)
                {
                    int idMecanico = empleadoEncontrado.IdEmpleado;
                    // Se trae el valor de la hora de almuerzo del recepcionista y se cuadra con la fecha del dia
                    DateTime horaAlmuerzoEmpleado = Convert.ToDateTime(hdValueDate.Value + " " +empleadoEncontrado.HoraAlmuerzo.ToString("hh:mm tt"));
                    DateTime horaEntradaEmpleado = Convert.ToDateTime(hdValueDate.Value + " " + empleadoEncontrado.HoraEntrada.ToString("hh:mm tt"));
                    DateTime horaSalidaEmpleado = Convert.ToDateTime(hdValueDate.Value + " " + empleadoEncontrado.HoraSalida.ToString("hh:mm tt"));
                    // Se revisa si el rango es inferior a la hora de entrada del empleado o superior a la hora de salida
                    if (finalRango < horaEntradaEmpleado || inicioRango > horaSalidaEmpleado)
                    {
                        e.Row.Cells[i].Text = "No Disponible";
                        e.Row.Cells[i].CssClass = "cellNotAvailable";
                    }
                    // Se realiza la comparacion de la hora de almuerzo del empleado
                    else if ((horaAlmuerzoEmpleado >= inicioRango && horaAlmuerzoEmpleado < finalRango) || (horaAlmuerzoEmpleado < inicioRango && horaAlmuerzoEmpleado.AddHours(1) > finalRango) || (horaAlmuerzoEmpleado.AddHours(1) > inicioRango && horaAlmuerzoEmpleado.AddHours(1) <= finalRango))
                    {
                        e.Row.Cells[i].Text = "Hora de Almuerzo";
                        e.Row.Cells[i].CssClass = "cellLunchHour";
                    }
                    // Se verifica si existe alguna cita para este empleado en este rango de hora
                    else if (((TList<PatCitaTaller>)Session["listCitasTaller"]).Find(delegate(PatCitaTaller utilCita) { return utilCita.IdRecepcionistaAsignado == idMecanico && (Convert.ToDateTime(utilCita.FechaCita.ToString(ConfigurationManager.AppSettings["DateFormat"]) + " " + utilCita.HoraCita.ToString("hh:mm tt")) >= inicioRango) && (Convert.ToDateTime(utilCita.FechaCita.ToString(ConfigurationManager.AppSettings["DateFormat"]) + " " + utilCita.HoraCita.ToString("hh:mm tt")) < finalRango); }) == null)
                    {
                        //Se agrega boton de disponible y estilo a la celda
                        LinkButton btnDisponible = new LinkButton();
                        btnDisponible.Text = "Disponible";
                        btnDisponible.CssClass = "notUnderLine";
                        btnDisponible.CommandArgument = inicioRango.ToString("hh:mm tt") + "$" + finalRango.ToString("hh:mm tt") + "$" + idMecanico.ToString() + "$" + empleadoEncontrado.Nombres + " " +empleadoEncontrado.Apellidos;
                        btnDisponible.Click += new EventHandler(btnDisponible_Click);
                        e.Row.Cells[i].Controls.Add(btnDisponible);
                        e.Row.Cells[i].CssClass = "cellAvailable";

                        AsyncPostBackTrigger evtShow = new AsyncPostBackTrigger();
                        evtShow.ControlID = btnDisponible.ID;
                        evtShow.EventName = "Click";
                        upnFormaNuevaCita.Triggers.Add(evtShow);
                    }
                    else
                    {
                        //Se agrega un texto que diga no disponible y el estilo de la celda
                        e.Row.Cells[i].Text = "No Disponible";
                        e.Row.Cells[i].CssClass = "cellNotAvailable";
                    }
                }
            }
        }
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void btnDisponible_Click(object sender, EventArgs e)
    {
        String[] parametros = ((LinkButton)sender).CommandArgument.Split('$');
        FormNuevaCita1.IdTaller = hdValueTaller.Value;
        FormNuevaCita1.NombreTaller = hdValueNombreTaller.Value;
        FormNuevaCita1.RangoSeleccionadoCompleto = parametros[0] + " " + parametros[1];
        FormNuevaCita1.RangoSeleccionadoInicio = parametros[0];
        FormNuevaCita1.IdMecanico = parametros[2];
        FormNuevaCita1.NombreMecanico = parametros[3];
        FormNuevaCita1.FechaSeleccionada = hdValueDate.Value;
        FormNuevaCita1.ReiniciarIndices();
        FormNuevaCita1.LimpiarControles();
        upnFormaNuevaCita.Update();
        mdlFormaNuevaCita.Show();
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnCloseConfirmModal_Click(object sender, EventArgs e)
    {
        mdlConfirmModal.Hide();
        lblConfirmText.Text = String.Empty;
    }
    #endregion
}
